package jp.co.toshiba.ffsa.action.csde;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import jp.co.toshiba.ffsa.action.common.CommonAction;
import jp.co.toshiba.ffsa.common.Crypto;
import jp.co.toshiba.ffsa.entity.AttachedFile;
import jp.co.toshiba.ffsa.form.csde.Csde501Form;
import jp.co.toshiba.ffsa.service.common.ConstantValue;
import jp.co.toshiba.ffsa.service.csde.Csde501Service;

import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.MessageResourcesUtil;

/**
 * 設計I/F - ファイル削除確認画面
 * @author npc
 */

public class Csde501Action extends CommonAction{
    @ActionForm
    @Resource
    protected Csde501Form csde501Form;
    protected String screenID = "CSDE501";

    /**
     * 初期処理
     * @return 画面遷移先
     */
    @Execute(validator = false)
    public String index() throws Exception {
        try{
            // ログイン済判定する
            if (!judgeLogin(csde501Form.getSessionId())) {
                return topTransition;
            }

            // リファラ判定
            if (!judgeRefferer()) {
                return topTransition;
            }

            // 暗号化されていた機密情報を復号
            decryptSecretData();

            // 検索処理
            search();

            // 機密情報を暗号化
            encryptSecretData();

            return "/csde/csde501.jsp";

        } catch (Exception e) {
            errorLogWriter(e, "index", screenID);
            throw e;
        }

    }


    /**
     * バリデーションエラー処理
     * @return 遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String error() throws Exception{
           return index();
    }

    /**
     * 検索処理
     * @throws Exception
     */
    public void search() throws Exception {
           //値をセットする
           Csde501Service csde501Service = new Csde501Service();
           csde501Service.setProjectId(csde501Form.projectId);
           csde501Service.setWorkflowId(csde501Form.workflowId);
           csde501Service.setRevision(csde501Form.revision);

           //attached_file情報を取得する(複数件)
           csde501Form.attachedFileList = csde501Service.getAttachedFileInfo();
    }

    /**
     * 削除処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = true, input="/csde/csde501/error")
    public String delete() throws Exception{

        String transition = "/csde/csde501.jsp"; // 遷移先
        String result = "";

        try{
            // ログイン済判定する
            if (!judgeLogin(csde501Form.getSessionId())) {
                return topTransition;
            }

            // リファラ判定
            if (!judgeRefferer()) {
                return topTransition;
            }

            // 暗号化されていた機密情報を復号
            decryptSecretData();

            //値をセットする
            Csde501Service csde501Service = new Csde501Service();
            csde501Service.setProjectId(csde501Form.projectId);
            csde501Service.setWorkflowId(csde501Form.workflowId);
            csde501Service.setRevision(csde501Form.revision);

            //attached_file情報を取得する(複数件)
            List<AttachedFile> attachedFileList = csde501Service.getAttachedFileInfo();
            //ファイルを指定する
            File[] fileList =  csde501Service.assignFile();

            for(int i=0; i< attachedFileList.size(); i++ ){

                // 対象ファイルの存在チェック
                if(!fileList[i].exists()){
                    String filename = attachedFileList.get(i).fileName;
                    FileNotFoundException e = new FileNotFoundException(filename);    //エラーログ出力
                    throw e;
                }

                //対象ファイルの削除
                if(!fileList[i].delete()){
                    IOException e = new IOException(MessageResourcesUtil.getMessage("csde501.012"));
                    throw e;
                }
            }

            // テーブルデータの削除処理の結果件数は0以上の場合
            int deleteCount = csde501Service.deleteCount();
            if( deleteCount > 0){
                transition = "/csde/csde502/";
                result = ConstantValue.success;
            }else{
                //テーブルデータの削除処理(論理削除)が失敗する場合
                SQLException e = new SQLException(MessageResourcesUtil.getMessage("csde501.011"));
                throw e;
            }

            if(ConstantValue.success.equals(result)){
                // 操作ログ記述
                ArrayList<ArrayList<String>> parameters = new ArrayList<ArrayList<String>>();
                ArrayList<String> parameterNames = new ArrayList<String>();
                ArrayList<String> values = new ArrayList<String>();
                parameterNames.add(MessageResourcesUtil.getMessage("csde501.013"));
                values.add(csde501Form.projectId);
                parameterNames.add(MessageResourcesUtil.getMessage("csde501.006"));
                values.add(csde501Form.workflowId);
                parameterNames.add(MessageResourcesUtil.getMessage("csde501.007"));
                values.add(String.valueOf(csde501Form.revision));
                for(int i=0; i< attachedFileList.size(); i++ ){
                    parameterNames.add(MessageResourcesUtil.getMessage("csde501.008"));
                    values.add(attachedFileList.get(i).fileName);
                }
                parameters.add(parameterNames);
                parameters.add(values);
                entryOperationHistory(screenID, "delete", parameters, result);
            }

            // 機密情報を暗号化
            encryptSecretData();

            return transition;

        }catch (Exception e) {
            errorLogWriter(e, "delete", screenID);
            throw e;
        }
    }

    private void encryptSecretData() throws Exception {
        csde501Form.projectId = Crypto.encrypt(csde501Form.projectId);
    }

    private void decryptSecretData() throws Exception {
        csde501Form.projectId = Crypto.decrypt(csde501Form.projectId);
    }

}
